package com.atguigu.gulimall.cart.controller;

import com.atguigu.gulimall.cart.interceptor.CartInterceptor;
import com.atguigu.gulimall.cart.service.CartService;
import com.atguigu.gulimall.cart.vo.Cart;
import com.atguigu.gulimall.cart.vo.CartItem;
import com.atguigu.gulimall.cart.vo.UserInfoTo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import java.util.List;
import java.util.concurrent.ExecutionException;

/**
 * @Author 小坏
 * @Date 2021/1/28 14:11
 * @Version 1.0
 * @program: 父工程 gulimall 万物起源之地
 */

@Controller
public class CartController {


    @Autowired
    private CartService cartService; //购物车service


    /**
     * 获取登录的购物车数据
     *
     * @return
     */
    @GetMapping("/currentUserCarItems")
    @ResponseBody
    public List<CartItem> getCurrentUserCarItems() {
        System.out.println(cartService.getUserCarItems());
        return cartService.getUserCarItems();
    }


    /**
     * 浏览器有一个cookie; user-key; 标识用户身份，-个月后过期;
     * 如果第一次使用jd的购物车功能，都会给-个临时的用户身份;
     * 浏览器以后保存，每次访问都会带上这个cookie;
     * 登录: session有
     * 没登录:按照cookie里 面带来user-key来做。
     * 第一次:如果没有临时用户，帮忙创建一个临时用户。
     */

    @GetMapping("cart.html")
    public String cartListPage(Model model) throws ExecutionException, InterruptedException {

        //只要点击获取购物车就清空临时的

        /**
         * 1、快速得到用户信息，登录有id、没有登录有user-key
         * 2、使用jdk自带的ThreadLocal、在同一个线程共享数据,每一个请求进来、tomcat会开一个请求给我们处理、
         *     从拦截器的执行、到controller、service、dao、 到结束给浏览器响应、 自始至终都是同一个线程、
         *     在同一个线程期间、上一个人放的数据有可能是我们的其他service、或者其他人放的数据、在下一个里面要共享所以需要ThreadLocal
         * 3、ThreadLocal核心原理
         *      Map<Thread,Object> threadLocal
         *          map的key是Thread、当前线程、每一个线程拥有他的key
         *          v:就是当前要共享的数据
         *   相当于线程不一样、取的值就不一样、所以每个线程互不干扰
         */

        UserInfoTo userInfoTo = CartInterceptor.threadLocal.get();


        Cart cart = cartService.getCart();
        System.out.println(cart+"cart 的用户"+userInfoTo);
        model.addAttribute("cart", cart);
        return "cartList";

    }

    /**
     * 添加商品到购物车
     * 跳转到购物车页面
     * 商品id
     * 商品数量
     * RedirectAttributes ra
     * ra.addFlashAttribute("skuId", skuId); 将数据放在session  里面可以在页面取出，但是只能取一次
     * ra.addAttribute("skuId", skuId); 将数据放在url后面
     *
     * @return
     */
    @GetMapping("addToCart")
    public String addToCart(@RequestParam("skuId") Long skuId, @RequestParam("num") Integer num, RedirectAttributes ra) throws ExecutionException, InterruptedException {
        cartService.addToCart(skuId, num);

        /**
         * 存储在model中
         * 1、如果是转发就存在请求域
         * 2、如果是重定向他也会拼到地址中
         */
        ra.addAttribute("skuId", skuId);
        return "redirect:http://cart.gulimall.com/addToCartSuccess.html";
    }

    /**
     * 上面的 addToCart 已添加成功就跳转成功页
     * 跳转成功页
     * 问题：
     * 总刷新页面只是查询一下，不会再刷新一下添加一次
     *
     * @param skuId
     * @param model
     * @return
     */
    @GetMapping("addToCartSuccess.html")
    public String addToCartSuccess(@RequestParam("skuId") Long skuId, Model model) {
        /**
         * 重定向到成功页面，再次查询购物车数据即可
         */
        CartItem item = cartService.getCartItem(skuId);
        model.addAttribute("item", item);
        return "success";
    }

    /**
     * 勾中购物项
     *
     * @param skuId
     * @param check
     * @return
     */

    @GetMapping("checkItem")
    public String checkItem(@RequestParam("skuId") Long skuId,
                            @RequestParam("check") Integer check) {
        cartService.checkItem(skuId, check);
        return "redirect:http://cart.gulimall.com/cart.html";
    }


    /**
     * 改变购物车数量
     *
     * @param skuId
     * @param num
     * @return
     */
    @GetMapping("countItem")
    public String countItem(@RequestParam("skuId") Long skuId,
                            @RequestParam("num") Integer num) {
        cartService.changeItemCount(skuId, num);
        return "redirect:http://cart.gulimall.com/cart.html";
    }


    /**
     * 删除购物车
     *
     * @param skuId
     * @return
     */

    @GetMapping("deleteItem")
    public String deleteItem(@RequestParam("skuId") Long skuId) {
        cartService.deleteItem(skuId);
        return "redirect:http://cart.gulimall.com/cart.html";
    }


}
